﻿// Inner Fire 游戏引擎库
// 实例化相关定义
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 用于实例化项目的定义。
// 比如：实例化精灵，调试线段。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-03-19

#pragma once

#include <DirectXMath.h>

namespace ifire {

/// <summary>
/// 用于实例Sprite的主项目
/// </summary>
struct InstancedSpriteConstants {
  DirectX::XMFLOAT4X4 world = IDENTITY_4X4;
  DirectX::XMFLOAT4 color; // 一并指定颜色
  DirectX::XMFLOAT3 scale; // 每一个子项目的缩放
  float pad1;
};

/// <summary>
/// 用于实例Sprite的绘制项目
/// </summary>
struct InstancedSpriteData {
  union {
    // 位置
    DirectX::XMFLOAT4 vec[4];
    DirectX::XMFLOAT4X4 mat;
  };
};

struct InstancedSprite {
  // 此项目是否有效
  bool enable;
  // 此项目已经存续的时间
  float tick;
  // 此项目的存续时间。如果设置为0，表示永远存续
  float duration;

  // 此项目的位置
  IVec4 v1;
  // 如果是线段，表示线段的终点
  IVec4 v2;
  // 此项目的颜色
  IVec4 v3;

  InstancedSprite()
      : enable(false)
      , tick(0.0f)
      , duration(0.0f)
      , v1(0.0f, 0.0f, 0.0f, 0.0f)
      , v2(0.0f, 0.0f, 0.0f, 0.0f)
      , v3(1.0f, 1.0f, 1.0f, 1.0f) {}

  IVec3 GetPosition() const { return IVec3(v1.x, v1.y, v1.z); }
  void SetPosition(IVec3 v) { v1 = IVec4(v.x, v.y, v.z, 0.0f); }
  IVec3 GetEnd() const { return IVec3(v2.x, v2.y, v2.z); }
  void SetEnd(IVec3 v) { v2 = IVec4(v.x, v.y, v.z, 0.0f); }
  IVec4 GetRotation() const { return v2; }
  void SetRotation(IVec4 v) { v2 = v; }
  IVec3 GetScale() const { return IVec3(v3.x, v3.y, v3.z); }
  void SetScale(IVec3 v) { v3 = IVec4(v.x, v.y, v.z, 0.0f); }
  IVec4 GetColor() const { return v3; }
  void SetColor(IVec4 v) { v3 = v; }
};

/// <summary>
/// 用于地图实例的绘制项目
/// </summary>
struct MapBlockData {
  // 变换矩阵
  DirectX::XMFLOAT4X4 mat;
  // 贴图Offset
  DirectX::XMFLOAT2 tex_offset;
  float pad1;
  float pad2;
};

} // namespace ifire